const x_PI = 3.14159265358979324 * 3000.0 / 180.0;
const gcj02tobd09 = function (_lng, _lat) {
  const lat = +_lat;
  const lng = +_lng;
  const z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
  const theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
  const bd_lng = z * Math.cos(theta) + 0.0065;
  const bd_lat = z * Math.sin(theta) + 0.006;
  return [bd_lng.toFixed(6), bd_lat.toFixed(6)]
};

export {gcj02tobd09}


/**
 * Created by zenghongtu on 15/10/2018.
 * Desc: index
 */

class wgs84tobd09 {

  constructor() {
    this.x_PI = 3.14159265358979324 * 3000.0 / 180.0;
    this.PI = 3.1415926535897932384626;
    this.a = 6378245.0;
    this.ee = 0.00669342162296594323;
  }

  convert_xy(lng, lat) {
    const r = this.gcj02tobd09(...this.wgs84togcj02(lng, lat));
    return r
  }

  /**
   * google to baidu
   * @param g lng
   * @param t lat
   * @returns {*[]}
   */
  gcj02tobd09(g, t) {
    const x_PI = this.x_PI;
    const lat = +t;
    const lng = +g;
    const z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
    const theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
    const bd_lng = z * Math.cos(theta) + 0.0065;
    const bd_lat = z * Math.sin(theta) + 0.006;
    return [bd_lng.toFixed(6), bd_lat.toFixed(6)]
  }

  /**
   * osm to google
   * @param lng
   * @param lat
   * @returns {*[]}
   */
  wgs84togcj02(lng, lat) {
    const PI = this.PI;
    const a = this.a;
    const ee = this.ee;
    const transformlat = function transformlat(lng, lat) {
      var lat = +lat;
      var lng = +lng;
      var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
      ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
      ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
      ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
      return ret
    };

    const transformlng = function transformlng(lng, lat) {
      var lat = +lat;
      var lng = +lng;
      var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
      ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
      ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
      ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
      return ret
    };
    var lat = +lat;
    var lng = +lng;

    var dlat = transformlat(lng - 105.0, lat - 35.0);
    var dlng = transformlng(lng - 105.0, lat - 35.0);
    var radlat = lat / 180.0 * PI;
    var magic = Math.sin(radlat);
    magic = 1 - ee * magic * magic;
    var sqrtmagic = Math.sqrt(magic);
    dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
    dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
    var mglat = lat + dlat;
    var mglng = lng + dlng;
    return [mglng, mglat]
  }
}

export {wgs84tobd09}
